Top 10k strings from Programmierung der Z80 (19xx)(-)(de)(Part 3 of 3).z80 in <root> / bin / z80 / software / Sinclair Spectrum Collection TOSEC.exe / Sinclair ZX Spectrum - Utilities & Educational / Sinclair ZX Spectrum - Utilities & Educational - [Z80] (TOSEC-v2007-01-01) /

Back to the directory listing

   3 0 + 0 = 0","
   2 a$="237 , "+
   2 1 + 1 = 1"
   2 1 + 0 = 1","
   2 0 + 1 = 1","
   2 "1) den Inhalt vom Port c zum Byte  ( hl )","
   1 re)+". Gleichzeitig legt er die Return-Adresse auf den Stack. Ein ret-Befehl  nimmt diese dann vom Stapel und springt zurueck.":
   1 q$=q$+i$(m):
   1 q$="(iy+N)"
   1 p$=p$+i$(n)
   1 p$="(iy+N)"
   1 p$="(iy)")
   1 d$=d$+i$(n):
   1 d$="bcdehlfa"
   1 bringen","2) b  =  b - 1","3) hl  =  hl - 1":
   1 bringen","2) b  =  b - 1","3) hl  =  hl - 1","4) zum Pkt. 1) springen, bis b = 0":
   1 bringen","2) b  =  b - 1","3) hl  =  hl + 1":
   1 b$="zieht, wenn der Inhalt des Akkus  > 159 ist, 160 ab. In beiden Faellen wird 6  hinzuaddiert.":
   1 b$="zieht vom b-Register  1  ab und erhoeht den Programmzaehler nur um DIS, wenn b < > 0  ist.":
   1 b$="zieht den Akku von 256 ab   a = 256 - a":
   1 b$="zieht  "+p$+"  vom Akkumulator ab .":
   1 b$="verschiebt das Register  "+p$+"  um ein Bit nach rechts, wobei der Inhalt des Carry in die Luecke, das herausgerollte Bit ins Carry rutscht.":
   1 b$="verschiebt das Register  "+p$+"  um ein Bit nach links, wobei der Inhalt des Carry in die Luecke, das herausgerollte Bit ins Carry rutscht.":
   1 b$="verschiebt das Register  "+p$+"  nach rechts. Das herausgerollte Bit rutscht sowohl in die Luecke, als auch in das Carry-Flag.":
   1 b$="verschiebt das Register  "+p$+"  nach rechts, wobei eine Null in die Luecke wandert. Das herausgerollte Bit wandert ins Carry.":
   1 b$="verschiebt das Register  "+p$+"  nach rechts, wobei das herausgerollte Bit in das Carry wandert. In die Luecke rutscht dasselbe Bit, was sich vorher dort befand.":
   1 b$="verschiebt das Register  "+p$+"  nach links. Das herausgerollte Bit rutscht sowohl in die Luecke, als auch in das Carry-Flag.":
   1 b$="verschiebt das Register  "+p$+"  nach links, wobei eine Null in dei Luecke rutscht. Das herausgerollte Bit wandert ins Carry.":
   1 b$="vergleicht das Byte  "+p$+"  mit dem Inhalt des Akkus. Trifft der Vergleich zu, so wird das Zero-Flag = 1 gesetzt.":
   1 b$="uebergibt den Inhalt des Registers "+q$+"  an das Port  "+p$(2
   1 b$="tut ueberhauptnichts.":
   1 b$="tauscht die Inhalte der Registersaetze untereinander aus.":
   1 b$="tauscht die ""Digits"" der Bytes  a  und  ( hl ) wie oben gezeigt wird, aus.":
   1 b$="tauscht  "+q$+"  und  "+p$+"  miteinander aus.":
   1 b$="subtrahiert vom Register  "+w$+"  sowohl das Carry-Flag, als auch das Register  "+q$+" .":
   1 b$="springt zum Unterprogramm mit der Adresse  NN "+(", wenn die Bedingung "+p$+" efuellt ist"
   1 b$="setzt das  "+w$+" . Bit des Registers  "+q$+" = 1 .":
   1 b$="setzt Carry-Flag = 1 .":
   1 b$="loescht das  "+w$+" . Bit des Registers  "+q$+" .":
   1 b$="liest das Port  "+q$(2
   1 b$="liest das  "+w$+" . Bit des Registers  "+q$+" . Das Ergebnis wandert in das Zero-Flag .":
   1 b$="laedt  "+q$+"  in den Stackpointer hinein.":
   1 b$="laedt  "+q$+"  in  "+p$+"  hinein.":
   1 b$="kehrt vom Unterprogramm zurueck ins Hauptprogramm.":
   1 b$="kehrt nur ins Hauptprogramm zurueck, wenn die Bedingung  "+p$+"  erfuellt ist.":
   1 b$="invertiert den Inhalt des Akkus vollstaendig  a = 255 - a":
   1 b$="invertiert Carry-Flag.":
   1 b$="holt die obersten zwei Bytes vom Stack und gibt sie in das Registerpaar  "+p$+" . Der Stackpointer  sp  wird um 2 erhoeht.":
   1 b$="erniedrigt  "+p$+"  um  1 .":
   1 b$="erhoeht  "+p$+"  um  1 .":
   1 b$="entspricht einem  call  "+p$+"  .":
   1 b$="bringt das Registerpaar  "+p$+"  an die Adresse des Stackpointers  sp und zieht von  sp  2  ab.":
   1 b$="addiert zum Registerpaar  "+w$+"  das Paar  "+q$+" hinzu .":
   1 b$="addiert zum Register  "+w$+"  sowohl das Carry-Flag, als auch das Register  "+q$+" .":
   1 b$="addiert zum Akkumulator das Byte  "+q$+" .":
   1 b$="Springt zur Adresse  "+q$+"  , wenn die Bedingung  "+p$+"  erfuellt ist .":
   1 b$="Springt zur Adresse  "+p$+"  .":
   1 b$="Erhoeht den Programmzaehler um DIS"+(" , wenn die Bedingung  "+p$+"  zutrifft."
   1 b$="= bitweise  UND - Funktion mit dem Operanden  "+p$+" . Ergebnis in Akku, wenn Null, Zero-Flag = 1":
   1 b$="= bitweise  ODER - Funktion mit dem Operanden  "+p$+" . Ergebnis in Akku, wenn Null, Zero-Flag = 1.":
   1 b$="= bitweise  Exclusive ODER - Funktion mit dem Operanden  "+p$+" . Ergebnis in Akku, wenn Null, Zero-Flag = 1":
   1 a$=a$+o$(n)+" ":
   1 a$="stop  =  Ende der Eingabe":
   1 a$="out ( 254 ) , a":
   1 a$="out  ( c ) , "+e$:
   1 a$="out  ( N ) , a":
   1 a$="in "+e$+" , ( c )":
   1 a$="akku  ( hl )"(1
   1 a$="a'  , f'  , b'  , c'  , d'  , e'  , h'  und  l'":
   1 a$="Zum Erzeugen eines Tons in dieser Art, sendet man zuerst eine Zahl zwischen 0 und 7 ( bedingt auch die Farbe ) zum Port. Nach einer bestimmten Zeit schickt man eine Zahl zwischen 248 und 255 ( 248 + Farbe ) zum Port.":
   1 a$="Zeile muss im c - Register, Spalte im b - Register stehen. Ergebnis steht dann wieder im c-Register":
   1 a$="Zahlenausdruck an der laufenden PRINT-Position : Startadresse = 6683":
   1 a$="Zahl muss vorher im bc-Registerpaar stehen.":
   1 a$="Y - Koordinate muss vorher im b - Register stehen, X - Koordinate im c - Register":
   1 a$="Wie wir hier sehen koennen, wartet die b-Schleife  200 Mikrocyclen ab. Der Index der hl-Schleife bestimmt die Tonlaenge. Bitte variieren Sie den Index der b-Schleife, um unterschiedliche Tonlhoehen zu bekommen.":
   1 a$="Wie Sie wissen, benutzt die Z80 die Register a, f, b, c, d, e, h  und  l . Nun, neben diesem Registersatz kennt die Z80 einen weiteren derartigen Registersatz mit den Registern":
   1 a$="Vor dem Aufruf muss im de-Registerpaar die Startadresse des zu druckenden Textes stehen, im bc-Register die Laenge des Textes.":
   1 a$="Vor dem Aufruf muss im de-Register die Tonlaenge, im hl-Register die Tonhoehe stehen.":
   1 a$="Stoppen Sie auch das Tonband !":
   1 a$="So, genug des Lehrmaterials. Wenn Sie jetzt noch nicht alles verstanden haben sollten, nicht traurig sein, sondern von vorne laufen lassen ! ! !":
   1 a$="Seite "+
   1 a$="Sehen wir uns dazu dieses kurze Programm an :":
   1 a$="Scrollroutine ; scrollt eine Zeile nach oben ; Startadresse = 3280":
   1 a$="SOUND-Routine : Startadresse = 949":
   1 a$="SCREEN$-Routine : Startadressen = 9528 und 11249":
   1 a$="PRINT-Routine : Startadresse = 16  ( auch mit rst 16 )":
   1 a$="POINT-Routinen : Startadressen 8910 und 7833":
   1 a$="PLOT-Routine : Startadresse 8933":
   1 a$="OTDR ( Codes 237 , 187 ) macht dagegen das :":
   1 a$="Nun folgt zum Schluss nocheinmal die Erklaerung aller Befehlsarten. Geben Sie dazu einen Befehl ein, und der Computer wird ihn erlaeutern.":
   1 a$="Moechten Sie hier auch Druckerauszuege von jeder Seite ?  ( ja / nein )":
   1 a$="Man setzt fuer gewoehnlich eine Warteschleife zwischen die beiden OUT-Befehle. Diese Wartezeit bestimmt die Tonhoehe. Da das ganze aber unbaendig schnell geht, setzen wir den ganzen Vorgang in eine Schleife, die dann die Tonlaenge bestimmt.":
   1 a$="Man kann den 254er Port auch zum Erzeugen eines Rauschens benutzen. Dazu schickt man ganz einfach ganz ungeordnete Werte zum Port. Fuer das menschliche Ohr hoert sich das dann wie Rauschen an. Die unterschiedlichen Bytes holen wir uns ganz einfach aus dem ROM.":
   1 a$="Man kann auch das Port Nr. c  mit vielen Befehlen ansprechen. Man benutzt dazu die IN- und OUT-Befehle :":
   1 a$="Kanal (0, 1, 2 oder 3) muss vorher im Akku stehen.":
   1 a$="Ich gebe Ihnen zu den ROM-Routinen die Startadressen, sowie wichtige Daten an ( Vergessen Sie nicht Ihre Register mit push und pop zu retten ) :":
   1 a$="Hier bestimmt die b-Schleife die Staerke des Rauschens ( grau  bis weiss )":
   1 a$="Genauso wie die LDIR / CPIR - Gruppe gibt es auch eine  INIR und OTIR - Gruppe  (Auf den naechsten Seiten sind sie erklaert.":
   1 a$="Genauso wie PEEK und POKE im BASIC  Adressen schreiben ( POKE ) , bzw. lesen ( PEEK ) koennen, so kann man sowohl in BASIC, als auch in Maschinensprache mit den Befehlen IN und OUT an den User-Port des Spectrum Signale senden und empfangen.":
   1 a$="Geben Sie einen beliebigen Befehl ein  (mit Operanden, wie im Anhang C ) !":
   1 a$="Farbe muss vorher im Akkumulator stehen.":
   1 a$="Einen ""Klick"" - Ton zum Lautsprecher. Gleichzeitig faerbt sich der Bildschirmrand  (BORDER)  mit der Farbe des Inhaltes des Akkus.":
   1 a$="Ein OUT-Befehl in Maschinensprache hat die Form":
   1 a$="Druecken Sie jetzt eine Taste ..."
   1 a$="Drucken von Strings an der laufenden PRINT-Position : Startadresse = 8252":
   1 a$="Dieser Befehl gehoert zur Interruptprogram- mierung !":
   1 a$="Die Zeile muss wieder im c-Register, die Spalte im b-Register stehen. Als Ergebnis zeigt das de-Registerpaar auf die Adresse des Zeichens.":
   1 a$="Die Y-X-Koordinaten muessen wieder im bc-Register stehen. Das Ergebnis steht dann im c-Register":
   1 a$="Die Eingabe war ungueltig !":
   1 a$="Der Mikroprozessor kann allerdings immer nur mit einem Registersatz arbeiten. Zum Austauschen der Registersaetze benutzt man den Befehl  EXX
   1 a$="Der Befehl OTIR ( Codes 237 , 179 ) macht folgendes :":
   1 a$="Der Befehl "+d$+"  tut die oben beschriebenen Dinge.":
   1 a$="Der Befehl  OUTI (Codes 237 , 163) macht das :":
   1 a$="Der Befehl  OUTD (Codes  237 , 171) macht das :":
   1 a$="Der Befehl  INI  ( Codes  237 , 162 )  tut Folgendes auf einmal :":
   1 a$="Der Befehl  INDR (Codes 237 , 186) tut folgendes aufeinmal :":
   1 a$="Der Befehl  IND (Codes 237 , 170) tut dagegen das :":
   1 a$="Der Befehl  "+i$:
   1 a$="Der  INIR - Befehl  (Codes  237 , 178) macht das :":
   1 a$="Das waeren also die wichtigsten Befehle der Z80. Ab der naechsten Seite finden Sie die wichtigsten ROM-Routinen fuer den Spectrum . . .":
   1 a$="Das bedeutet, dass man den Inhalt des Akkus an die Port-Adresse  N schickt. Wir aber wollen uns nur mit dem Port Nr. 254 beschaeftigen, denn dieser wird fuer die Ansprechung auf den Lautsprecher benutzt. Z.B. schickt der Befehl":
   1 a$="Das  af- Registerpaar ( Akku & Flags ) kann man extra nocheinmal mit dem Befehl  EX  af , af'  ( Code  8 ) austauschen.":
   1 a$="D i e  B e f e h l e   I N  u n d   OUT"
   1 a$="Codes":
   1 a$="CLS - Routine : Startadresse = 3435":
   1 a$="Bildkanal oeffnen : Startadresse = 5633":
   1 a$="Befehl":
   1 a$="BORDER-Routine : Startadresse = 8859":
   1 a$="Auch diese Befehle sprechen das  Port mit der Nummer  ( c )  an.":
   1 a$="ATTR-Routine : Startadressen = 9603 und 7833":
   1 a$="ASCII- oder Farbzeichen-Code muss vor dem Aufruf im Akku stehen.":
   1 a$="= Register/Zahl":
   1 a$="= Akkumulator":
   1 a$="= Akku nachher":
   1 a$=" Druecken Sie jetzt bitte eine beliebige Taste...":
   1 Druecken Sie jetzt eine Taste ...
   1 ;"  Bitte eine Taste druecken ... ":
   1 1 + 1 = 0"
   1 1 + 0 = 0","
   1 0 + 1 = 0","
   1 )+"  . Das Ergebnis wandert ins Register "+p$+" .":
   1 (q$="(ix+N)"
   1 (p$="(ix+N)"
   1 ( Code 217 ).":
   1 % fuer den ZX-Spectrum"
   1 "cp ( hl )","hl = hl - 1","bc = bc - 1","zurueck, bis entweder bc=0","oder a=( hl )":
   1 "cp ( hl )","hl = hl - 1","bc = bc - 1","
   1 "cp ( hl )","hl = hl + 1","bc = bc - 1","zurueck, bis entweder bc=0","oder a=( hl )":
   1 "cp ( hl )","hl = hl + 1","bc = bc - 1","
   1 "Port c --> ( hl )","hl = hl + 1","b = b - 1","
   1 "Port  c --> ( hl )","hl = hl - 1","b = b - 1","
   1 "Port  c ---> ( hl )","hl = hl - 1","b = b - 1","zurueck, bis b=0","
   1 "Port  c ---> ( hl )","hl = hl + 1","b = b - 1","zurueck, bis b=0","
   1 "Adresse","Befehle","Codes","x","40000","ld  hl , 1000","33 , 232 , 3","40003","ld  a , 0","62 , 0","40005","out ( 254 ) , a","211 , 254","40007","ld  b , 200","6 , 200","40009","djnz, <---<","16 , 254"
   1 "40011","ld  a , 255","62 , 255","40013","out ( 254 ) , a","211 , 254","40015","dec hl","43","40016","ld  a , h","124","40017","or  l","181","40018","jr  nz,","32 , 239","40020","ret","201"
   1 "40000","ld  hl , 2560","33 , 0 , 10","40003","ld  a , ( hl )","126","40004","out ( 254 ) , a","211 , 254","40006","ld  b , 40","6 , 40","40008","djnz  <---<","16 , 254","40010","dec  hl","43","40011","ld  a , h","124","40012","or  l","181","40013","jr  nz ,","32 , 244","40014","ret","201"
   1 "1) den Inhalt vom Port c zum Byte ( hl )","
   1 "1) Port c zum Byte ( hl )","2) b  =  b - 1","3) hl  =  hl + 1","4) zu Pkt. 1) springen, bis  b = 0":
   1 "1) Byte ( hl ) zum Port c bringen","2) b  =  b - 1","3) hl  =  hl - 1":
   1 "1) Byte ( hl ) zum Port c bringen","2) b  =  b - 1","3) hl  =  hl + 1":
   1 "1) Byte  ( hl ) zum Port  c  bringen","2) b  =  b - 1","3) hl  =  hl - 1","4) zum Pkt. 1) springen, bis b = 0":
   1 "1) Byte  ( hl ) zum Port  c  bringen","2) b  =  b + 1","3) hl  =  hl + 1","4) zum Punkt 1) springen, bis b = 0"
   1 "( hl ) --> Port  c","hl = hl - 1","b = b - 1","
   1 "( hl ) --> Port  c","hl = hl + 1","b = b - 1","
   1 "( hl ) --> ( de )","de = de - 1","hl = hl - 1","bc = bc - 1","zurueck, bis bc = 0":
   1 "( hl ) --> ( de )","de = de + 1","hl = hl + 1","bc = bc - 1","zurueck, bis bc = 0":
   1 "( hl ) ---> Port  c","hl = hl - 1","b = b - 1","zurueck, bis b=0","
   1 "( hl ) ---> Port  c","hl = hl + 1","b = b - 1","zurueck, bis b=0","
   1 "( hl ) ---> ( de )","de = de + 1","hl = hl + 1","bc = bc - 1","
   1 "( de ) --> ( hl )","de = de - 1","hl = hl - 1","bc = bc - 1","
   1  Die wichtigsten